今天又来写题了呀
codeforces 755D PolandBall and Polygon
新加入一条直线的区域块数 =原有的区域的块数+ 与该直线相交的直线的条数+1
题目
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 1e6+10;
int a[maxn],n,k;
int sum(int x)
{
int res = 0;
while(x>0)
{
res+=a[x];
x -= x & -x;
}
return res;
}
void add(int x)
{
while(x<=n)
{
a[x]+=1;
x += x & -x;
}
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
LL ans=1;
int s=1,e;
memset(a,0,sizeof(a));
if(k>(n/2))//注意
k=n-k;
for(int i=0; i<n; ++i)
{
e=(s+k)%n;
if(e==0)
e=n;
if(s<e)
ans+=sum(e-1)-sum(s)+1;
else
ans += sum(n)-sum(s)+sum(e-1)+1;
if(i!=n-1)
printf("%lld ",ans);
else
printf("%lld\n",ans);
add(s);
add(e);
s=e;
}
}
return 0;
}
#include<iostream>
using namespace std;
long long b[1000005],c[1000005],d[1000005];
int main()
{
long long n,k,i,j;
while(cin>>n>>k)
{
k=k<=n/2?k:n-k; ///先做出判断,k对于n前后具有对称性
b[0]=1,c[0]=0;
for(i=1;i<=n;i++)
{
b[i]=b[i-1]+k; ///把递增的数据存在b[]中
c[i]=(b[i]-1)/n; ///把数据取整n的结果保存在c[]中
}
int blag=0,t=0; ///blag用来标记在c[i]==c[i-1]的条件下c[i-1]==c[i-2]?,t用来累加d[i]数据
d[0]=1;
for(i=1;i<=n;i++)
{
if(c[i]==c[i-1])
{
if(!blag) ///假如c[i]==c[i-1]并且c[i-1]!=c[i-2]
{
blag=1;
t++; ///t要多累加一次
}
}
else
{
if(blag) ///如果出现了c[i]!=c[i-1],blag初始化为0,方便进行下一次判断
blag=0;
t++;
}
d[i]=d[i-1]+t; ///每次累加的数据用d[i]来保存
}
for(i=1;i<n;i++)
cout<<d[i]<<" ";
cout<<n*k+1<<endl;
}
return 0;
}
SGU 180 Inversions
树状数组 +逆序对 +离散化
#include<bits/stdc++.h>
using namespace std;
const int N=6e4+5;
int n;
int num[N];
int treenum[N];
int lowbit(int x )
{
return x&(-x);
}
int getsum(int x)
{
int sum=0;
while(x)
{
sum+=treenum[x];
x-=lowbit(x);
}
return sum;
}
void add(int x,int val)
{
while(x<N)
{
treenum[x]+=val;
x+=lowbit(x);
}
}
int search(int x)
{
int left=0;
int right =n-1;
while(left<=right)
{
int mid=(left+right)>>1;
if(num[mid]==x)
return mid+1;
else if(num[mid]<x)
left=mid+1;
else right=mid-1;
}
}
long long solve()
{
int temp[N];
memcpy(temp,num,sizeof(num));
long long ans=0;
for (int i=0;i<n;i++)
{
int x=search(temp[i]);
ans+=i-getsum(x);
add(x,1);
}
return ans;
}
int main()
{
int x;
while(scanf("%d",&n)!=EOF)
{
memset(treenum,0,sizeof(treenum));
for (int i=0;i<n;i++)
{
scanf("%d",&num[i]);
num[i]++;
}
cout<<solve()<<endl;
}
return 0;
}