xtuoj矩形
这道题的思路是1.将数据排序、去重、统计次数2.分为正方形和普通矩形处理其中普通矩形处理运用了二分求解的思想通过枚举每一条边x找到其对应的上值maxy与下值miny则对这一x满足条件的y也就是矩形个数有right-left1个要注意正方形只能计一次12和21是同一种所以在找left和right的时候要加一个判断leftlefti?left:i1(lefti为正方形前面已经计算过了lefti会有12和21重复请款#includestdio.h #includestdlib.h #define maxn 100005 typedef long long ll; typedef struct { ll b; int count; }node; node nodes[maxn]; ll a[maxn]; int cmp(const void*a,const void*b){ return *(ll*)a-*(ll*)b; } int find(node*nodes,int m,ll target,int flag){ int l0,rm-1,reflag?m:-1; while(lr){ int mid(lr)/2; if(flag){ if(nodes[mid].btarget){ remid; rmid-1; } else lmid1; } else{ if(nodes[mid].btarget){ remid; lmid1; } else rmid-1; } }return re; } int main(){ int n; ll l,r; scanf(%d %lld %lld,n,l,r); for(int i0;in;i){ scanf(%lld,a[i]); } qsort(a,n,sizeof(ll),cmp); int m0; for(int i0;in;i){ if(i0||a[i]!a[i-1]){ nodes[m].ba[i]; nodes[m].count1; m; } else nodes[m-1].count; } ll re0; for(int i0;im;i){ ll xnodes[i].b; if(nodes[i].count2x*xrx*xl)re; } for(int i0;im;i){ ll xnodes[i].b; ll miny(lx-1)/x; ll maxyr/x; if(minymaxy)continue; int leftfind(nodes,m,miny,1); leftlefti?left:i1; int rightfind(nodes,m,maxy,0); if(leftright)re(right-left1); } printf(%lld\n,re); return 0; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2422215.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!