codeforces #149 div 2
来源:互联网 发布:淘宝欧米茄碟飞翻新表 编辑:程序博客网 时间:2024/05/16 15:56
A 题,巨水,题意读懂就能A。
C题,昨晚没做出来,因为数据范围是10^9*10^9,所以没往搜索方面想,然后比完看到别人的评论,发现漏看一个重要条件,就是It is guaranteed that the total length of all given segments doesn't exceed 105.
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); }}
C题,昨晚没做出来,因为数据范围是10^9*10^9,所以没往搜索方面想,然后比完看到别人的评论,发现漏看一个重要条件,就是It is guaranteed that the total length of all given segments doesn't exceed 105.
就是所有线段的总长度不超过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 longusing 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 longusing 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;}
- codeforces #149 div 2
- Codeforces Round #149 (Div. 2)
- Codeforces Round #149 (Div. 2)
- Codeforces Round #149 (Div. 2)
- Codeforces Round #149 (Div. 2)解题报告
- Codeforces Round #149 (Div. 2) (bfs+STL)
- codeForces #140 div 2
- Codeforces #154 div 2
- Codeforces 156 div.2
- codeforces 167 div 2
- codeforces #176 div.2
- Codeforces 193 Div 2
- Codeforces #223 Div.2
- codeforces #313(div 2)
- Codeforces 307div.2
- Codeforces #355 div.2
- Codeforces #107 div 2
- Codeforces 200 div.2
- my97日期控件的使用
- radiobuttonlist控件使用
- Polymorphism
- js判断变量是否未定义
- 下拉列表等控件默认值的设置
- codeforces #149 div 2
- jsp存储textarea到数据中换行问题
- State_hundle
- aspnetpager控件的绑定
- [数据结构]线性结构——线性表
- 信号量,互斥锁和条件变量之间的差异
- Mysql 客户端
- 学习笔记5(CATransform3D-Cube)
- Windows Server 2012 Hyper-V新特性(1)