#
为树状树组量身打造的题...
不过我是线段树..
#include <iostream>
#include <stdio.h>
using namespace std;
const int MAXN=32005;
struct node
{
int l,r;
int d;
};
node t[MAXN*4];
int ans[MAXN];
void build(int l_,int r_,int p)
{
t[p].l=l_;
t[p].r=r_;
t[p].d=0;
if (l_!=r_)
{
build(l_,(l_+r_)/2,p<<1);
build((l_+r_)/2+1,r_,(p<<1)+1);
}
}
int find(int r_,int p)
{
if (t[p].r<=r_) return t[p].d;
int l=t[p].l;
int r=t[p].r;
int sum=0;
if (r_<=(l+r)/2) sum+=find(r_,p*2);
else sum+=t[p*2].d+find(r_,p*2+1);
return sum;
}
void insert(int x,int p)
{
int l=t[p].l;
int r=t[p].r;
t[p].d++;
if (l==r) return;
if (x<=(l+r)/2) insert(x,p*2); else insert(x,p*2+1);
}
int n;
int main()
{
memset(ans,0,sizeof(ans));
build(0,MAXN,1);
cin>>n;
for (int i=1;i<=n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
ans[find(x,1)]++;
insert(x,1);
}
for (int i=0;i<n;i++)
cout<<ans[i]<<endl;
// system("pause");
return 0;
}
摘要: 裸treap...学会了删除..orz..
#include <iostream>//#include <fstream>using namespace std;//ifstream fin("t3481.in");const int MAXN=100000;const int IN...
阅读全文
摘要: treap..有几个地方写的很尴尬...其实我没写过平衡树...任何的平衡树..所以我就把对于size的维护写错了..orz..然后我又把砍掉一棵子树那部分写错了..我感觉这样砍树是会造成一定的不平衡的..但不平衡会很小.呃..其实也不能这么说..应该说..会造成不平衡..但这个不平衡带给我的负担不会高于我曾经的负担..orz..貌似是这样
#include <iostream&...
阅读全文
2分图
构图
两个集合是一样的,都是所有的*号
如果某两个*之间挨着,就连线
求最大匹配
可以轻易得出这个最大匹配把每个*都求了2遍
因此除以2,再加上未匹配的*,得解..
难点就是构图..
事实上匹配,网络流等的难点也就是构图
#include <iostream>
//#include <fstream>
using namespace std;
//ifstream fin("t3020.in");
struct node
{
int x,y;
};
const int MAXN=401;
node edge[MAXN];
bool connect[MAXN][MAXN];
bool hash[MAXN];
int v[MAXN];
int n;
int h,w;
int len;
bool find(int x)
{
for (int i=1;i<=len;i++)
{
if (!connect[x][i]) continue;
if (!hash[i])
{
hash[i]=true;
if (v[i]==0||find(v[i]))
{
v[i]=x;
return true;
}
}
}
return false;
}
int main()
{
cin>>n;
while(n--)
{
cin>>h>>w;
len=0;
for (int i=1;i<=h;i++)
for (int j=1;j<=w;j++)
{
char ch;
cin>>ch;
if ('*'==ch)
{
len++;
edge[len].x=i;
edge[len].y=j;
}
}
//init
memset(connect,0,sizeof(connect));
for (int i=1;i<=len;i++)
for (int j=1;j<=len;j++)
{
if (i==j) continue;
if (1==abs(edge[i].x-edge[j].x)+abs(edge[i].y-edge[j].y))
connect[i][j]=true;
}
//
memset(v,0,sizeof(v));
int answer=0,ans=0;
for (int i=1;i<=len;i++)
{
memset(hash,0,sizeof(hash));
if (find(i)) answer++;
else
ans++;
}
cout<<answer/2+ans<<endl;
// system("pause");
}
return 0;
}