tju3243 Blocked Road
来源:互联网 发布:数控车螺纹编程实例 编辑:程序博客网 时间:2024/06/03 23:50
There are N seaside villages on X island, numbered from 1 to N. N roads are built to connect all of them, which are also numbered from 1 to N, and the road with number i connects the village i and i % N + 1. Sometimes, for some reasons, some roads are blocked, so some villages are not connected anymore. Now, you are assigned to write a program to offer dynamic information about the connectivity.
At first, all roads are not blocked. The input will tell you the road with number i are blocked or unblocked, or ask you if village i and j are connected. Here two villages are connected means we can reach another village from one via some unblocked road. BTW, all the roads are bidirectional.
Input
The first line of the input contains one integer T, which indicate the number of test cases. The very first line of each case contains two integers, N and M. N (where 2 ≤ N ≤ 100000) is the total number of the villages, M (where 1 ≤ M ≤ 100000) is the number of queries. The next M lines each describe one query. For each line, the first integer (0 or 1) indicates the type of the query. If the first integer is 0, there will be another integer i followed, if the road i is blocked at present, it will be unblocked, and vice versa. If the query type is 1, there will be two more integers i and j followed, if the village i and j are connected at present, the answer is 1, otherwise it shall be 0.Output
For each query of type 1, output its answer in a single lineSample Input
15 101 2 50 41 4 50 21 3 41 1 30 10 21 2 41 2 5
Sample Output
111010
一开始以为是并查集,后来想想不能实现,看了别人的思路,发现因为连接的道路很有规律,所以可以用树状数组来实现,这题主要是判断两个点是否是相连的,这里因为是环装,所以两点有两种可能的连接顺序,一种是从小的数到大的数,另一种是从大的数到小的数。
#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<vector>#include<map>#include<queue>#include<stack>#include<string>#include<algorithm>using namespace std;int b[100005],n,zhi[100006];int lowbit(int x){return x&(-x);}void update(int pos,int num){while(pos<=n){b[pos]+=num;pos+=lowbit(pos);}}int getsum(int pos){int num=0;while(pos>0){num+=b[pos];pos-=lowbit(pos);}return num;}int main(){int m,i,j,T,a,c,d;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(i=1;i<=n;i++){zhi[i]=1;b[i]=lowbit(i);}for(i=1;i<=m;i++){scanf("%d",&a);if(a==0){scanf("%d",&c);if(zhi[c]==1){update(c,-1);zhi[c]=0;}else {update(c,1);zhi[c]=1;}}else{scanf("%d%d",&c,&d);if(c>d)swap(c,d);if( getsum(d-1)-getsum(c-1)==d-c || getsum(n)-getsum(d-1)+getsum(c-1)==c+n-d )printf("1\n");else printf("0\n");}}}return 0;}
0 0
- tju3243 Blocked Road
- tju3243 Blocked Road(树状数组/线段树)
- UESTC 1182 Blocked Road
- [TOJ]3243 Blocked Road --线段树
- [TOJ] 3243 Blocked Road -- 树状数组、线段树
- road
- Road
- Road
- Road
- Road
- road
- blocked Queue
- Session blocked itself
- CF 392 Blocked Points
- MySql Host is blocked
- Oracle 阻塞(blocking blocked)
- 解锁 kill blocked spids
- rfkill: WLAN hard blocked
- 运行程序exe无法启动,dll找不到
- ViewHolder的另一种简化的巧妙写法
- hadoop,学习心得
- 三帧差法的实现
- MSP430仿真器降级失败的解决办法
- tju3243 Blocked Road
- (4)LinuxI2C驱动--从两个访问eeprom的例子开始
- rust 用指针类型转换的方法将u8数组(或slice)转换成u32
- Unix NetWork Programming——环境搭建(解决unp.h等源码编译问题)
- UVA - 1374 Power Calculus
- priority inversion
- XCODE中添加pch文件
- Linux常用命令大全
- Bit Manipulation Single Number II