题目描述
GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信息点数,点数为房间里的人数,如果一个房间里的一群人已经做过实验了那么这些人将不会增加实验信息点数(不会增加是针对这一群人的,不是对这群人中的每个人,即1,2,3做了实验,1,2再做实验还会增加2点实验点数)
输入输出格式
输入格式:
第一行两个整数n,m,q(n,m,q<=10^5)表示人数,房间数和操作数
接下来q行每行一个操作 "C i j"表示让第i个人去房间j "W l r" 表示让区间[l,r]的房间做实验
输出格式:
对于每一个W操作,输出一个数,表示此次操作所获得的实验点数
输入输出样例
输入样例#1: 复制
3 5 7 C 1 2 C 2 2 W 1 2 C 3 2 W 1 2 C 3 3 W 1 3
输出样例#1: 复制
View Code
3 3 0
map和set强行怼
set可以直接删除内容!! 也可以用下标删除
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define pb push_back #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define inf 0x3f3f3f3f const int N=1e5+5; set<int>room[N]; map<set<int>,int>mp; int pos[N],m,n,q,a,b; char s[2]; set<int>::iterator it; int main() { RIII(n,m,q); rep(i,1,n) room[1].insert(i),pos[i]=1; while(q--) { RS(s);RII(a,b); if(s[0]=='C') { room[pos[a]].erase(a); pos[a]=b; room[b].insert(a); } else { int ans=0; rep(i,a,b) { if(mp[room[i]])continue; ans+=room[i].size(); mp[room[i]]=1; } cout<<ans<<endl; } } return 0; }