Segment Tree with Pruning
#include<iostream>
#include<cstring>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
int T;
ll n,k;
map<ll,ll> mp;
ll build(ll n){
if(mp.find(n)!=mp.end()) return mp[n];
if(n<=k) return mp[n]=1;
return mp[n]=build(n/2)+build(n-n/2)+1;
}
int main(){
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--){
mp.clear();
cin>>n>>k;
cout<<build(n)<<endl;
}
}
Game on Plane
#include<iostream>
#include<cstring>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
const int N=100010;
int T;
int n;
map<double,int> mp;
int xa,ya,xb,yb;
int cnt[N],ans[N];
bool vis[N];
int mx,idx;
int main(){
scanf("%d",&T);
while(T--){
mp.clear();
scanf("%d",&n);
for(int i=1;i<=n;i++){
cnt[i]=0;
vis[i]=false;
}
mx=0;idx=0;
for(int i=1;i<=n;i++){
scanf("%d%d%d%d",&xa,&ya,&xb,&yb);
int tmp1=yb-ya;
int tmp2=xb-xa;
// cout<<(double)tmp1/tmp2<<endl;
double tmp;
if(tmp2!=0) tmp=(double)tmp1/tmp2;
else tmp=3e9;
mp[tmp]++;
cnt[mp[tmp]]++;
mx=max(mx,mp[tmp]);
}
// cout<<"MX--"<<mx<<endl;
// for(int i=1;i<=2;i++)
// printf("%d ",cnt[i]);
// puts("");
for(int i=1;i<=mx;i++) cnt[i]+=cnt[i-1];
// for(int i=1;i<=mx;i++) printf("%d ",cnt[i]);
// puts("");
for(int i=1;i<mx;i++){
ans[cnt[i]+1]=cnt[i]-i;
vis[cnt[i]+1]=true;
}
ans[1]=0;
for(int i=2;i<=n;i++)
if(!vis[i]) ans[i]=++idx;
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
}
}
京公网安备 11010502036488号