A - Tokitsukaze and Enhancement
简单题不与说明
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int,int> P;
#define VNAME(value) (#value)
#define bug printf("*********\n");
#define debug(x) cout<<"["<<VNAME(x)<<" = "<<x<<"]"<<endl;
#define mid (l+r)/2
#define chl 2*k+1
#define chr 2*k+2
#define lson l,mid,chl
#define rson mid+1,r,chr
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a));
const long long mod=1e9+7;
const int maxn=1e6+5;
const int INF=0x7fffffff;
const LL inf=0x3f3f3f3f;
const double eps=1e-8;
void f() {
#ifndef ONLINE_JUDGE
freopen("dat.in", "r", stdin);
#endif // ONLIN_JUDGE
}
int main() {
f();
int x;
cin>>x;
x=x%4;
if(x==0) {
printf("1 A\n");
} else if(x==1) {
printf("0 A\n");
} else if(x==2) {
printf("1 B\n");
} else printf("2 A\n");
return 0;
}
B - Tokitsukaze and Mahjong
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int,int> P;
#define VNAME(value) (#value)
#define bug printf("*********\n");
#define debug(x) cout<<"["<<VNAME(x)<<" = "<<x<<"]"<<endl;
#define mid (l+r)/2
#define chl 2*k+1
#define chr 2*k+2
#define lson l,mid,chl
#define rson mid+1,r,chr
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a));
const long long mod=1e9+7;
const int maxn=1e6+5;
const int INF=0x7fffffff;
const LL inf=0x3f3f3f3f;
const double eps=1e-8;
void f() {
#ifndef ONLINE_JUDGE
freopen("dat.in", "r", stdin);
#endif // ONLIN_JUDGE
}
LL n,m,k;
LL a[maxn];
int main() {
cin>>n>>m>>k;
for(int i=0; i<m; i++) {
scanf("%lld",&a[i]);
}
sort(a,a+m);
LL sum=0,ans=0,num=0;
LL page=1;
for(int i=0; i<m; i++) {
if(a[i]<=page*k+sum) {
num++;
} else {
if(num==0) {
page=(a[i]-sum+k-1)/k;
num++;
} else {
ans++;
sum+=num;
page=(a[i]-sum+k-1)/k;
num=1;
}
}
}
if(num!=0)ans++;
printf("%lld\n",ans);
return 0;
}
C - Tokitsukaze and Discard Items
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int,int> P;
#define VNAME(value) (#value)
#define bug printf("*********\n");
#define debug(x) cout<<"["<<VNAME(x)<<" = "<<x<<"]"<<endl;
#define mid (l+r)/2
#define chl 2*k+1
#define chr 2*k+2
#define lson l,mid,chl
#define rson mid+1,r,chr
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a));
const long long mod=1e9+7;
const int maxn=1e6+5;
const int INF=0x7fffffff;
const LL inf=0x3f3f3f3f;
const double eps=1e-8;
void f() {
#ifndef ONLINE_JUDGE
freopen("dat.in", "r", stdin);
#endif // ONLIN_JUDGE
}
LL n,m,k;
LL a[maxn];
int main() {
cin>>n>>m>>k;
for(int i=0; i<m; i++) {
scanf("%lld",&a[i]);
}
sort(a,a+m);
LL sum=0,ans=0,num=0;
LL page=1;
for(int i=0; i<m; i++) {
if(a[i]<=page*k+sum) {
num++;
} else {
if(num==0) {
page=(a[i]-sum+k-1)/k;
num++;
} else {
ans++;
sum+=num;
page=(a[i]-sum+k-1)/k;
num=1;
}
}
}
if(num!=0)ans++;
printf("%lld\n",ans);
return 0;
}
D - Tokitsukaze, CSL and Stone Game
一开始以为这题是博弈,后来发现是模拟,好不容易写出来了被fst 了。。。。毒瘤
首先这题是简单粗暴,因为选择到两个相同的就输了,说明每一个都不相同,最终状态肯定是 0 1 2 3 .... n-1
这种状态肯定是必输,无法动弹。所以最终都会变成这个状态,判断一下到这个状态的奇偶就是答案。
另外还有一开始就输了的状态,比如 3 4 4 两个一样的,只能选一样的,但是选了有一个和他相同,还有 0 0 一开始就有两个0 还有就是 5 5 5 三个一样的或者两对两个一样的,这四种状态绝对是直接输了。
By ET_BUBBLE, contest:
Codeforces Round #573 (Div. 2), problem: (D) Tokitsukaze, CSL and Stone Game, Accepted, #
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int,int> P;
#define VNAME(value) (#value)
#define bug printf("*********\n");
#define debug(x) cout<<"["<<VNAME(x)<<" = "<<x<<"]"<<endl;
#define mid (l+r)/2
#define chl 2*k+1
#define chr 2*k+2
#define lson l,mid,chl
#define rson mid+1,r,chr
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a));
const long long mod=1e9+7;
const int maxn=1e6+5;
const int INF=0x7fffffff;
const LL inf=0x3f3f3f3f;
const double eps=1e-8;
void f() {
#ifndef ONLINE_JUDGE
freopen("dat.in", "r", stdin);
#endif // ONLIN_JUDGE
}
LL n;
LL a[maxn];
int flag=1,num;
map<LL,LL> mp;
LL sum=0;
int main() {
cin>>n;
for(int i=0; i<n; i++) {
cin>>a[i];
}
sort(a,a+n);
for(int i=0; i<n; i++) {
if(mp.find(a[i])!=mp.end()) {
num++;
if(mp.find(a[i]-1)!=mp.end())flag=0;
}
mp[a[i]]++;
}
if(num>1||mp[0]>=2||flag==0) {
puts("cslnb");
return 0;
}
if(n==1) {
puts((a[0]&1)?"sjfnb":"cslnb");
} else {
int flag=1;
sum=0;
for(int i=0; i<n; i++) {
if(a[i]<i) {
flag=0;
} else {
sum+=a[i]-i;
}
}
if(flag==0) {
puts("cslnb");
return 0;
}
puts(sum%2==1?"sjfnb":"cslnb");
}
return 0;
}
F - Tokitsukaze and Strange Rectangle
恕我直言 这题应该是先开的题,就是个***题,一开始觉得太简单了,肯定读错题了。。。不敢写。。。。赛后补提排序写错了,T到自闭,玄学复杂度。
题意:自己读去
题解:先按照,y从大到小排序在按照x从小到大排序,然后每次判断一层y。
先判断第一层 1 2 6 7 10 (假设)y=10
然后判断第二层 4 8 (假设) y = 9
第一层能够出现的不同的选法是 5*(5-1)/2;
第二层会受到第一层的影响 1 2 在 4 前面,所以
要选 4 的矩形情况 是
红色l到右边蓝色r的所有矩形,会选上4,同理选上8又不和前面的重复就只能是这样了。
然后又可以发现,如果有第3层 ,前面两层对第3层的影响只与x的出现有关,每次判断一层只需要考虑上面出现的 x
的影响。
先离散化一下,然后用树状数组求一下这个点前面有多个点,后面有多少个点,然后乘一下就可以了。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int,int> P;
#define VNAME(value) (#value)
#define bug printf("*********\n");
#define debug(x) cout<<"["<<VNAME(x)<<" = "<<x<<"]"<<endl;
#define mid (l+r)/2
#define chl 2*k+1
#define chr 2*k+2
#define lson l,mid,chl
#define rson mid+1,r,chr
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a));
const long long mod=1e9+7;
const int maxn=1e6+5;
const int INF=0x7fffffff;
const LL inf=0x3f3f3f3f;
const double eps=1e-8;
void f() {
#ifndef ONLINE_JUDGE
freopen("dat.in", "r", stdin);
#endif // ONLIN_JUDGE
}
int bit[maxn+1],pos;
int sum(int i) {
int s=0;
while(i>0) {
s +=bit[i];
i-=i&-i;
}
return s;
}
void add(int i,int x) {
while(i<=pos) {
bit[i]+=x;
i+=i&-i;
}
}
int n;
struct node {
int x,y;
} p[maxn];
bool cmp(node &o1,node &o2) {
if(o1.y==o2.y)return o1.x<o2.x;
return o1.y>o2.y;
}
LL ans=0;
unordered_map<int,int>mp;
int a[maxn];
int main() {
f();
scanf("%d",&n);
for(int i=0; i<n; i++) {
scanf("%d%d",&p[i].x,&p[i].y);
a[i]=(p[i].x);
}
pos=1;
sort(a,a+n);
for(int i=0; i<n; i++) {
if(i==0) {
mp[a[0]]=pos++;
} else if(a[i]!=a[i-1]) {
mp[a[i]]=pos++;
}
}
for(int i=0; i<n; i++) {
p[i].x=mp[p[i].x];
}
sort(p,p+n,cmp);
int len=0;
a[len++]=p[0].x;
add(p[0].x,1);
int mx=pos;
for(int i=1; i<n; i++) {
if(p[i].y==p[i-1].y) {
a[len++]=p[i].x;
if(sum(p[i].x)-sum(p[i].x-1)==0)add(p[i].x,1);
} else {
int la=0;
// sort(a,a+len);
for(int j=0; j<len; j++) {
int i=a[j];
ans+=1LL*(sum(i)-sum(la))*(sum(mx)-sum(i-1));
la=i;
}
len=0;
a[len++]=(p[i].x);
if(sum(p[i].x)-sum(p[i].x-1)==0)add(p[i].x,1);
}
}
int la=0;
// sort(a,a+len);
for(int j=0; j<len; j++) {
int i=a[j];
ans+=1LL*(sum(i)-sum(la))*(sum(mx)-sum(i-1));
la=i;
}
printf("%lld\n",ans);
return 0;
}