int x,y,a,b; while(cin>>x>>y>>a>>b) { bool flag=0; int num=0; for(int i=max(b+1,a); i<=x; i++) { flag=1; for(int j=b; j<=y; j++) { if(i>j) { ans[num].x=i; ans[num].y=j; num++; } } } if(flag) { cout<<num<<endl; for(int i=0; i<num; i++) cout<<ans[i].x<<" "<<ans[i].y<<endl; } else cout<<0<<endl;
B题,同巨水
void solve() { int n; while(cin>>n) { int mi=2000000000; int ma=-1; // cout<<mi<<endl; for(int i=0; i<n; i++) { scanf("%d%d",&ans[i].x,&ans[i].y); if(mi>ans[i].x) mi=ans[i].x; if(ma<ans[i].y) ma=ans[i].y; } //cout<<mi<<ma<<endl; int aa=-1; for(int i=0; i<n; i++) { if(ans[i].x<=mi&&ans[i].y>=ma) { aa=i+1; break; } } printf("%d\n",aa); } }
就是所有线段的总长度不超过10^5。
晕了,这就表示最多是100000个点,可以用BFS来做。。。
int main() { int x1,x2,y1,y2; int m,r,a,b; cin>>x1>>y1>>x2>>y2; cin>>m; queue<pair<pair<int ,int >,int> >qe; set<pair<int ,int > >mm; while(m--) { cin>>r>>a>>b; for(int i=a;i<=b;i++) mm.insert(make_pair(r,i)); } qe.push(make_pair(make_pair(x1,y1),0)); mm.erase(make_pair(x1,y1)); bool flag=0; while(!qe.empty()) { int tempx=qe.front().first.first; int tempy=qe.front().first.second; int step=qe.front().second; //cout<<tempx<<" "<<tempy<<" "<<step<<endl; qe.pop(); if(tempx==x2&&tempy==y2) { cout<<step<<endl; return 0; } for(int i=-1;i<=1;i++) { for(int j=-1;j<=1;j++) { if(!i&&!j)continue; if(mm.count(make_pair(i+tempx,j+tempy))) { mm.erase(make_pair(i+tempx,j+tempy)); qe.push(make_pair(make_pair(i+tempx,j+tempy),step+1)); } } } } cout<<-1<<endl; return 0; }
D,见代码
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstring> #include <queue> #include <set> #include <vector> #include <stack> #include <map> #include <iomanip> #define PI acos(-1.0) #define Max 2005 #define inf INT_MAX #define LL(x) (x<<1) #define RR(x) (x<<1|1) #define FOR(i,s,t) for(int i=(s);i<=(t);++i) #define ll long long using namespace std; int head[100000]; struct kdq { int u,v,next; } edge[1000000]; int n,num,m; int aa[100000]; int visit[100000]; void init() { num=1; memset(head,-1,sizeof(head)); memset(visit,0,sizeof(visit)); } void insert(int u,int v) { edge[num].u=u; edge[num].v=v; edge[num].next=head[u]; head[u]=num++; } void bfs() { queue<int >q; queue<int>ans; memset(visit,0,sizeof(visit)); for(int i=1; i<=n; i++) q.push(i); while(!q.empty()) { int u=q.front(); q.pop(); if(visit[u]==aa[u])//如果已经按到的次数等于需要的次数,那么按下这个键, { ans.push(u); visit[u]++; //cout<<u<<" :"<<visit[u]<<endl; for(int i=head[u]; i!=-1; i=edge[i].next)//将与之相连的键都加1 { int v=edge[i].v; visit[v]++; if(visit[v]==aa[v])//同理 q.push(v); } } } cout<<ans.size()<<endl; while(!ans.empty()) { cout<<ans.front()<<" "; ans.pop(); } } int main() { cin>>n>>m; int a,b; init(); while(m--) { scanf("%d%d",&a,&b); insert(a,b); insert(b,a); } for(int i=1; i<=n; i++) scanf("%d",&aa[i]); bfs(); return 0; }
E,思路,按位建线段树,然后成段更新。
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstring> #include <queue> #include <set> #include <vector> #include <stack> #include <map> #include <iomanip> #define PI acos(-1.0) #define Max 100000 #define inf INT_MAX #define LL(x) (x<<1) #define RR(x) (x<<1|1) #define FOR(i,s,t) for(int i=(s);i<=(t);++i) #define ll long long using namespace std; struct Seg_Tree { int l,r,flag; ll len; ll digt[22]; }tree[Max*4]; int a[Max]; void PushUp(int u) { for(int i=0;i<22;i++) tree[u].digt[i]=tree[LL(u)].digt[i]+tree[RR(u)].digt[i]; } void build(int l,int r,int u) { tree[u].l=l; tree[u].r=r; tree[u].len=r-l+1; tree[u].flag=0; if(l==r) { for(int i=0;i<22;i++) if(1&(a[l]>>i)) tree[u].digt[i]=1; return ; } int mid=l+r>>1; build(l,mid,LL(u)); build(mid+1,r,RR(u)); PushUp(u); } void PushDown(int u) { if(tree[u].flag) { tree[LL(u)].flag^=tree[u].flag; tree[RR(u)].flag^=tree[u].flag; for(int i=0;i<22;i++) if(1&(tree[u].flag>>i)) { tree[LL(u)].digt[i]=tree[LL(u)].len-tree[LL(u)].digt[i]; tree[RR(u)].digt[i]=tree[RR(u)].len-tree[RR(u)].digt[i]; } } tree[u].flag=0; } void update(int l,int r,int u,int x) { if(l==tree[u].l&&tree[u].r==r) { tree[u].flag^=x; for(int i=0;i<22;i++) if(1&(x>>i)) tree[u].digt[i]=tree[u].len-tree[u].digt[i]; return ; } PushDown(u); int mid=tree[u].l+tree[u].r>>1; if(l>mid) update(l,r,RR(u),x); else if(r<=mid) update(l,r,LL(u),x); else { update(l,mid,LL(u),x); update(mid+1,r,RR(u),x); } PushUp(u); } ll ans; void query(int l,int r,int u) { if(l==tree[u].l&&r==tree[u].r) { for(int i=0;i<22;i++) ans+=tree[u].digt[i]*(1ll<<i); return ; } PushDown(u); int mid=tree[u].l+tree[u].r>>1; if(l>mid) query(l,r,RR(u)); else if (r<=mid) query(l,r,LL(u)); else { query(l,mid,LL(u)); query(mid+1,r,RR(u)); } // PushUp(u); } int main() { int n; cin>>n; for(int i=1;i<=n;i++) scanf("%d",&a[i]); int m; cin>>m; build(1,n,1); while(m--) { int op; scanf("%d",&op); if(op==1) { int x,y; scanf("%d%d",&x,&y); ans=0; query(x,y,1); cout<<ans<<endl; } else { int x,y,z; scanf("%d%d%d",&x,&y,&z); update(x,y,1,z); } } return 0; }