2008年成都赛区(中山)

2474 Process scheduling a题 multiset multimap用法

#include <cstdio>
#include <algorithm>
#include <set>
#include <map>
using namespace std;

const int maxn=50000+123;

struct Proc{
	int a[10], r[10];
	bool rls;
}p[maxn];
//int all[10][maxn], res[10][maxn];
int avl[10];
int m;

typedef pair<int, int> pii;
#define mp make_pair
#define sc second
#define fs first
multiset< pii >ms2;
multiset<int>ms;
multimap< pii, int >mm2;
multimap<int, int>mm;

bool cmp(Proc x, Proc y)
{
	for (int i=0; i<m; ++i)
	{
		if(x.r[i]<y.r[i])return true;
		if(x.r[i]>y.r[i])return false;
	}
	return true;
}

//int bin(int l, int r, int x, int pos)
//{
//	int mid;
//	while (l<r)
//	{
//		mid=(l+r)/2;
//		///printf("%d %d %d %d\n", r, l, mid, x);
//		if(p[mid].rls)mid++;
//		if(p[mid].r[pos]<x)l=mid+1;
//		else if(p[mid].r[pos]>x)r=mid-1;
//		else return mid;
//	}
//	return r;
//}

int main()
{
	int n;
	while (~scanf("%d%d", &n, &m))
	{
		for (int i=0; i<m; ++i)
		{
			for (int j=0; j<n; ++j)
			{
				scanf("%d", &p[j].a[i]);
				p[j].rls=false;
			}
		}
		for (int i=0; i<m; ++i)
			for (int j=0; j<n; ++j)
				scanf("%d", &p[j].r[i]);
		
		for (int i=0; i<m; ++i)
			scanf("%d", avl+i);
		bool flag=true;
		sort(p, p+n, cmp);
//		for (int i=0; i<n; ++i)
//		{
//			for (int j=0; j<m; ++j)
//			{
//				printf("%d ", p[i].r[j]);
//			}
//			puts("");
//		}
		
		if(m==1)
		{
			for(int i=0; i<n; ++i)
			{
				if(avl[0]>=p[i].r[0])
				{
					avl[0]+=p[i].a[0];
					p[i].rls=true;
				}
				else break;
			}
		}else 
		if(m==3)
		{
			ms2.clear();
			mm2.clear();
			for (int i=0, j=0; i<n; ++i)
			{
				while (j<n && p[j].r[0]<=avl[0])
				{
					pii tmp=mp(p[j].r[1], p[j].r[2]);
					ms2.insert(tmp);
					mm2.insert(mp(tmp, j));
					j++;
				}
				multiset<pii>::iterator it=ms2.upper_bound(mp(avl[1], avl[2])), it1;
				///if(it!=ms2.end())printf("%d  %d\n", it->fs, it->sc);
				if(it!=ms2.begin())
				{///while
					while(it!=ms2.begin()){
						it1=it;
						it--;
						if(it->fs<=avl[1] && it->sc<=avl[2])
						{
							multimap<pii, int>::iterator itlow;
							itlow=mm2.lower_bound(*it);
							///itup=mm2.upper_bound(*it);
							int pos=itlow->sc;
							///printf("%d %d\n", pos, i);
							p[pos].rls=true;
							for (int i=0; i<m; ++i)
							{
								avl[i]+=p[pos].a[i];
							}
							ms2.erase(it);
							mm2.erase(itlow);
							it=it1;
						}
					}
				}
				else break;
			}
		}else 
		if(m==2)
		{
			ms.clear();
			mm.clear();
			for (int i=0, j=0; i<n; ++i)
			{
				while (j<n && p[j].r[0]<=avl[0])
				{
					ms.insert(p[j].r[1]);
					mm.insert(mp(p[j].r[1], j));
					j++;
				}
				multiset<int>::iterator it=ms.upper_bound(avl[1]), it1;
//				if(it!=ms.end())printf("t!!! %d %d\n", *it, i);
				if(it!=ms.begin())
				{
					while (it!=ms.begin())
					{
						it1=it;
						it--;
						if(*it<=avl[1])
						{
							multimap<int, int>::iterator itlow=mm.lower_bound(*it);
							int pos=itlow->sc;
							p[pos].rls=true;
							for (int i=0; i<m; ++i)avl[i]+=p[pos].a[i];
//							printf("pos==%d  %d\n", pos, j);
//							for (int i=0; i<m; ++i)printf("%d ", avl[i]);
//							puts("");
							ms.erase(it);
							mm.erase(itlow);
							it=it1;
						}
					}
				}
				else break;
			}
		}
		for (int i=0; i<n; ++i)
			if(p[i].rls==false)flag=false;
		if(flag)puts("Yes");
		else puts("No");
	}
	return 0;
}
/*
5 1
1 0 1 1 1
5 4 3 2 1
1


5 2
0 0 0 0 0
0 0 1 0 0
1 1 0 0 0
0 0 1 2 2
0 1

5 2
0 0 0 0 1
0 0 1 0 0
1 1 0 0 0
0 0 1 2 2
0 1

5 3
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
1 1 0 0 0
0 0 1 2 2
0 0 1

5 3
0 0 0 0 0
0 0 0 0 1
0 0 1 0 0
0 0 0 0 0
1 1 0 0 0
0 0 1 2 2
0 0 1
*/

2482 Transit search

#include <cstdio>  
#include <cstring>  
#include <algorithm>  
#include <iostream>  
#include <queue>  
#include <string>
#include <vector>
#include <map>

using namespace std;  
  
typedef long long ll;
const int maxn=500+123;  
const int inf=0x3f3f3f3f;  
  
struct Edge{  
    int v, w, next;     
}edge[maxn*maxn];  
int head[maxn], cnt;  
  
struct Node{  
    int u, w;  
    bool operator < (Node a)const  
    {  
        return w > a.w;  
    }  
};  
  
void addedge(int u, int v, int w)  
{  
    edge[cnt].v=v;  
    edge[cnt].w=w;  
    edge[cnt].next=head[u];  
    head[u]=cnt++;  
}  
  
int dist[maxn];
void Dijkstra(int s, int t){///s是源点
    memset (dist, 0x3f, sizeof(dist));
    dist[s]=0;  
    priority_queue<Node> q;/// 需要<queue>
    Node cur;  
    cur.u=s; cur.w=0;  
    q.push(cur);  
    while (!q.empty()){  
        cur=q.top();  
        q.pop();  
        if(dist[cur.u]<cur.w)continue;  
        for (int p=head[cur.u]; ~p; p=edge[p].next)  
            if(dist[edge[p].v]>dist[cur.u]+edge[p].w){  
                dist[edge[p].v]=dist[cur.u]+edge[p].w;  
                ///if(edge[p].v==t)return; 
                Node tmp;  
                tmp.u=edge[p].v;  
                tmp.w=dist[edge[p].v];  
                q.push(tmp);  
            }  
    } 
}  

void init ()  
{  
    cnt=0;  
    memset (head, -1, sizeof(head));  
}  
int sx[3], sy[3];
int nx[5000+123], ny[5000+123];
int dist2(int x, int y, int x1, int y2)
{
	int res=(x1-x)*(x1-x)+(y2-y)*(y2-y);
	return res;
}

int main()
{
	int cas; scanf("%d", &cas);
	while (cas--)
	{
		for (int i=0; i<2; ++i)
		{
			int p=5120;
			char str[10]; int x, y;
			scanf("%s%d%d", str, &x, &y);
			sx[i]=4*x; sy[i]=4*y;
			for (int j=0; j<8; ++j)
			{
				int dir=str[j]-'0';
				if(dir&2)sx[i]+=p;
				if(dir&1)sy[i]+=p;
				p/=2;
				///printf("%d %lld %lld\n", i, sx[i], sy[i]);
			}
		///printf(" sss =====%I64d %I64d\n", sx[i], sy[i]);
		}
		int m; scanf("%d", &m);
		///mm.clear();
		vector<int> bus[123];
		map<string, int>mm;
		for (int i=0; i<m; ++i)
		{
			string str; 
			cin >> str;
			mm[str]=i;
			scanf("%d %d", nx+i, ny+i);
		}
		int n; scanf("%d", &n);
		///printf("%d!!!", n);
		for (int i=0; i<n; ++i)
		{
			///bus[i].clear();
			int k; scanf("%d", &k);
			string name;
			for (int j=0; j<k; ++j)
			{
				cin >> name;
				bus[i].push_back(mm[name]);
			}
		}
		
		if(dist2(sx[0], sy[0], sx[1], sy[1])<=4000000)
		{
			puts("walk there");
			continue;
		}
		init();
		for (int i=0; i<n; ++i)
		{
			int sz=bus[i].size();
			bool st=false, ed=false;
			for(int j=0; j<sz; ++j)
			{
				int ii=bus[i][j];
				if(dist2(sx[1], sy[1], nx[ii], ny[ii])<=1000000)
				{
					ed=true;
					///addedge(i+1, n+1, 0);
					///printf("!!!%d %d\n", i+1, n+1);
				}
				if(dist2(sx[0], sy[0], nx[ii], ny[ii])<=1000000)
				{
					st=true;
					///addedge(0, i+1, 0);
					///printf("!!!!!!!!%d %d\n", 0, i+1);
				}
			}
			if(ed)addedge(i+1, n+1, 0);
			if(st)addedge(0, i+1, 1);
			for (int j=0; j<n; ++j)if(i!=j)
			{
				int sz1=bus[j].size();
				bool flag=false;
				for (int k=0; k<sz; ++k)
					for (int p=0; p<sz1; ++p)
						if(bus[i][k]==bus[j][p])
						{	
							flag=true;
							break;
						}
				
				if(flag)
				{
					addedge(i+1, j+1, 1);
					///printf("!!!!%d %d\n", i+1, j+1);
				}
			}
		}
		Dijkstra(0, n+1);
		if(dist[n+1]==inf)puts("take a taxi");
		else printf("%d\n", dist[n+1]);
	}	
	return 0;
}
/*
10

00000000 1 1
00001000 3 3
4
a 1 1
b 20 30
c 40 50
d 100 100
2
3
a b c
3
b c d

00000000 1 1
03231130 5 5
5
a 1 1
b 2 2
c 3000 3000
d 3000 4000
e 4500 4000
2
2
a b
3
c d e

00000000 1 1
03231130 5 5
5
a 1 1
b 1000 1000
c 3000 3000
d 3000 4000
e 4500 4000
3
3
a b e
3
c d e
3 
a b c

00000000 1 1
03231130 5 5
4
a 1 1
b 1000 1000
c 3000 3000
d 3000 4000
2
3
a b c
3
b c d

*/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值