2 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N = 510000; int n, c[N]; bool a[N]; // a[i]的值只有0或1,表示第i号公路(点i-1与点i之间的公路)是否存在 // 注:代码中对第i号公路的定义与题意不同 int lowbit(int x) { return x & -x; } void add(int x, int k) { for (int i = x; i <= n; i += lowbit(i)) c[i] = c[i] + k; } int getsum(int x) { int ret = 0; for (int i = x; i >= 1; i -= lowbit(i)) ret += c[i]; return ret; } int main() { int T; scanf("%d", &T); while (T--) { int m; scanf("%d%d", &n, &m); memset(a, 0, sizeof(a)); memset(c, 0, sizeof(c)); for (int i = 1; i <= n; i++) add(i, 1), a[i] = 1; for (int i = 1, k, x, y; i <= m; i++) { scanf("%d", &k); if (k == 1) { scanf("%d%d", &x, &y); if (x > y) swap(x, y); int s1 = getsum(y) - getsum(x); // s1=路径x->x+1->……->y存在(没破坏)的边数 // s1=(n->1->2->…->y存在的边数) - (n->1->2->…->x存在的边数) // (n->1->2->…->y存在的边数) = getsum(y) // (n->1->2->…->x存在的边数) = getsum(x) int s2 = getsum(n) - getsum(y) + getsum(x); // s2=路径 y->y+1->……->n->1->2->……->x存在的边数 // //s2=(y->y+1->……->n存在的边数) + (n->1->2->……->x存在的边数) // (y->y+1->……->n存在的边数) = getsum(n)-getsum(y): // (n->1->2->……->x存在的边数) = getsum(x) if ((s1 == y - x) || (s2 == (n - y) + x)) printf("1\n"); else printf("0\n"); } else { int x; scanf("%d", &x); x = x % n + 1; // 题意中的第x号公路对应代码中的第x+1号公路,题意中的第n号公路对应代码中的第1号公路 if (a[x] == 1) a[x] = 0, add(x, -1); else a[x] = 1, add(x, 1); } } printf("\n"); } return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N=510000; int n,c[N]; bool a[N]; //a[i]的值只有0或1,表示第i号公路(点i-1与点i之间的公路)是否存在 //注:代码中对第i号公路的定义与题意不同 int lowbit(int x){return x&-x;} void add(int x,int k) { for(int i=x;i<=n;i+=lowbit(i))c[i]=c[i]+k; } int getsum(int x) { int ret=0; for(int i=x;i>=1;i-=lowbit(i))ret+=c[i]; return ret; } int main() { int T;scanf("%d",&T); while(T--) { int m;scanf("%d%d",&n,&m); memset(a,0,sizeof(a)); memset(c,0,sizeof(c)); for(int i=1;i<=n;i++)add(i,1),a[i]=1; for(int i=1,k,x,y;i<=m;i++) { scanf("%d",&k); if(k==1) { scanf("%d%d",&x,&y);if(x>y)swap(x,y); int s1=getsum(y)-getsum(x);//s1=路径x->x+1->……->y存在(没破坏)的边数 //s1=(n->1->2->…->y存在的边数) - (n->1->2->…->x存在的边数) //(n->1->2->…->y存在的边数) = getsum(y) //(n->1->2->…->x存在的边数) = getsum(x) int s2=getsum(n)-getsum(y) + getsum(x);//s2=路径 y->y+1->……->n->1->2->……->x存在的边数 ////s2=(y->y+1->……->n存在的边数) + (n->1->2->……->x存在的边数) //(y->y+1->……->n存在的边数) = getsum(n)-getsum(y): //(n->1->2->……->x存在的边数) = getsum(x) if( (s1==y-x) || (s2== (n-y) + x) )printf("1\n"); else printf("0\n"); } else { int x;scanf("%d",&x); x=x%n+1;//题意中的第x号公路对应代码中的第x+1号公路,题意中的第n号公路对应代码中的第1号公路 if(a[x]==1)a[x]=0,add(x,-1); else a[x]=1,add(x,1); } } printf("\n"); } return 0; }
- 1
信息
- ID
- 271
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 99
- 已通过
- 44
- 上传者