P1047 [NOIP2005 普及组] 校门外的树
1.第一次使用暴力匹配的方法解决,只能过前两个测试点
#include<iostream>
#include <cmath>
#include <vector>
using namespace std;
#define MAX 1000
int main()
{
int roadLength,zoneNumber;
int u_v[MAX][2];
int u,v;
cin>>roadLength>>zoneNumber;
int count = 0,countRepeat = 0;
int result;
for (int i=0; i<zoneNumber; i++)
{
cin>>u>>v;
u_v[i][0] = u;
u_v[i][1] = v;
for (int j=0; j<i; j++)
{
if((u_v[i][0] < u_v[j][0]))
{
if ((u_v[i][1] < u_v[j][1])&&(u_v[i][1] > u_v[j][0]))
{
countRepeat += u_v[i][1] - u_v[j][0] + 1;
}
else if(u_v[i][1] > u_v[j][1])
{
countRepeat += u_v[j][1] - u_v[j][0] + 1;
}
}
else if((u_v[i][0] > u_v[j][0])&&(u_v[i][0] < u_v[j][1]))
{
if((u_v[i][1] < u_v[j][1])&&(u_v[i][1] > u_v[j][0]))
{
countRepeat += u_v[i][1] - u_v[i][0] + 1;
}
else if(u_v[i][1] > u_v[j][1])
{
countRepeat += u_v[j][1] - u_v[i][0] + 1;
}
}else{
countRepeat += 0;
}
}
count += u_v[i][1] - u_v[i][0] + 1;
}
result =roadLength + 1 - (count - countRepeat);
cout<<result<<" ";
return 0;
}
2.第二次使用珂朵莉树数据结构,计算通过
不用单独考虑重复区域,应该做标记!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
#define re register
#define FOR(i,l,r) for(re int i=l;i<=r;++i)
#define IT set<node>::iterator
using namespace std;
int n,m,x,y;
inline void in(re int &x){
x=0;char c=getchar();
while(c<'0'||c>'9'){
c=getchar();
}
while(c<='9'&&c>='0'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
}
inline void out(re int a){
if(a>=10)out(a/10);
putchar(a%10+'0');
}
struct node{
int l,r;
mutable int v;
node(int L,int R=-1,int V=0):l(L),r(R),v(V) {}
bool operator <(const node &o)const{
return l<o.l;
}
};
set<node> s;
inline IT split(re int pos){
IT it=s.lower_bound(node(pos));
if(it!=s.end()&&it->l==pos)
return it;
--it;
int L=it->l;
int R=it->r;
int V=it->v;
s.erase(it);
s.insert(node(L,pos-1,V));
return s.insert(node(pos,R,V)).first;
}
inline void assign_val(re int l,re int r,re int val=0){
IT itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(node(l,r,val));
}
inline int query(re int l,re int r){
int res=0;
IT itr=split(r+1),itl=split(l);
for(;itl!=itr;++itl)
res+=(itl->r - itl->l+1)*(itl->v);
return res;
}
int main(){
in(n),in(m);
s.insert(node(0,n,1));
FOR(i,1,m){
in(x),in(y);
assign_val(x,y,0);
}
out(query(0,n));
puts("");
}
3.第三次使用标记法,计算通过
#include<iostream>
#include <cmath>
#include <vector>
using namespace std;
#define MAX 100000
bool assignValue(int l,int r,int value,int arr[])
{
int j;
if (l > r)
{
return false;
}
for (j = l;j<=r;j++)
{
arr[j] = value;
}
return true;
}
int countValue(int l,int r,int arr[])
{
int count, j;
count = 0;
for (j = l;j<=r;j++)
{
if (arr[j] == 1)
{
count += 1;
}
}
return count;
}
int main()
{
int n,m;
cin>>n>>m;
int valueVec[MAX];
int u,v,count;
assignValue(0,n,1,valueVec);
for (int i = 0 ;i < m;i++)
{
cin>>u>>v;
assignValue(u,v,0,valueVec);
}
count = countValue(0,n,valueVec);
cout<<count;
return 0;
}