1. 程式人生 > >CF- #515 (Div. 3),A,B,C,E

CF- #515 (Div. 3),A,B,C,E

A. Vova and Train

題目大意:給出一個序列,問遮擋了多少

1~n,然後每v個位置有一個數,問除去l~r覆蓋了的點,還剩多少個點,

解題:找規律模擬即可

ac:

//#pragma comment(linker, "/STACK:1024000000,1024000000") 
 
#include<stdio.h>
#include<string.h>  
#include<math.h>  
#include<stdlib.h>

//#include<map>   
//#include<set>
#include<deque>  
#include<queue>  
#include<stack>  
#include<bitset> 
#include<string>  
#include<fstream>  
#include<iostream>  
#include<algorithm>  
using namespace std;  
 
#define ll long long  
//#define max(a,b) (a)>(b)?(a):(b) 
//#define min(a,b) (a)<(b)?(a):(b) 
#define clean(a,b) memset(a,b,sizeof(a))// ˮӡ 
//std::ios::sync_with_stdio(false); 
const int MAXN=1e5+5; 
const ll INF=0x3f3f3f3f;  
const ll mod=1e9+7;  




int main()
{
	std::ios::sync_with_stdio(false); 
	int t;
	cin>>t;
	while(t--)
	{
		ll L,v,l,r;
		cin>>L>>v>>l>>r;
		ll sum=L/v;
		ll sum_l=(l-1)/v,sum_r=r/v;
		ll ans=sum-(sum_r-sum_l);
		cout<<ans<<endl;
	}
}

B. Heaters

題目大意:輸入n(有n個房子),m(每個有暖氣的房子覆蓋的範圍)

然後是這n個房子分別的狀態0無暖氣,1有暖氣

輸出最少的讓多少房子有暖氣能使這些房子都暖和,沒可能輸出-1

解題:貪心,遍歷一遍;

ac:

C. Books Queries

題目大意:給出n個操作,每次操作可以選擇從右或左插入一個數,或者訪問數x距離邊界的最短距離,輸出最短距離。

解題:對於每個數,都記錄一下右邊有多少個,左邊有多少個,然後直接輸出即可。

ac:

//#pragma comment(linker, "/STACK:1024000000,1024000000") 
 
#include<stdio.h>
#include<string.h>  
#include<math.h>  
#include<stdlib.h>

//#include<map>   
//#include<set>
#include<deque>  
#include<queue>  
#include<stack>  
#include<bitset> 
#include<string>  
#include<fstream>  
#include<iostream>  
#include<algorithm>  
using namespace std;  
 
#define ll long long  
//#define max(a,b) (a)>(b)?(a):(b) 
//#define min(a,b) (a)<(b)?(a):(b) 
#define clean(a,b) memset(a,b,sizeof(a))// ˮӡ 
//std::ios::sync_with_stdio(false); 
const int MAXN=2e5+55; 
const ll INF=0x3f3f3f3f;  
const ll mod=1e9+7;  

struct node{
	int l,r;
}a[MAXN];
int id[MAXN];

int main()
{
	std::ios::sync_with_stdio(false); 
	int n;
	while(cin>>n)
	{
		clean(a,0);
		clean(id,0);
		char oper;
		int data;
		cin>>oper>>data;
		if(oper!='?')//首先是第一個
			id[data]=1;
		a[1].l=0,a[1].r=0;
		int l=1,r=1;//初始化節點
		for(int j=2,i=2;j<=n;++j)//j個操作
		{
			cin>>oper>>data;
			if(oper=='L')//插左邊
			{
				id[data]=i;//他是第i個
				a[i].l=a[l].l+1;//是左邊的那個+1
				a[i].r=-a[i].l;//右邊的繼續
				l=i;//重新整理l
				i++;
			}
			else if(oper=='R')//插右邊
			{
				id[data]=i;
				a[i].r=a[r].r+1;
				a[i].l=-a[i].r;
				r=i;
				i++;
			}
			else//訪問
			{
//				cout<<"----------"<<endl;
//				cout<<l<<" "<<r<<endl;
//				cout<<a[l].l<<" "<<a[r].r<<endl;
//				cout<<a[id[data]].l<<" "<<a[id[data]].r<<endl;
//				cout<<"----------"<<endl;
				int num_l=a[l].l-a[id[data]].l;
				int num_r=a[r].r-a[id[data]].r;
				int ans=num_l>num_r?num_r:num_l;
				cout<<ans<<endl;
			}
		}
	}
}

E. Binary Numbers AND Sum

題目大意:輸入兩個n,m分別代表兩個字串的長度,然後輸入兩個字串a,b,都是二進位制數,然後進行:

ll sum=0;
while(b)
{
    sum=sum+a&b;
    b=b>>1;
}

運算,知道b表示的二進位制數為0;

解題:其實暴力迴圈肯定超時,因此我們看對於a中的每一位數,它能夠和b&多少次,然後記錄下來,再遍歷一遍a,對於每一位都加起來得到sum

ac:

//#pragma comment(linker, "/STACK:1024000000,1024000000") 
 
#include<stdio.h>
#include<string.h>  
#include<math.h>  
#include<stdlib.h>

//#include<map>   
//#include<set>
#include<deque>  
#include<queue>  
#include<stack>  
#include<bitset> 
#include<string>  
#include<fstream>  
#include<iostream>  
#include<algorithm>  
using namespace std;  
 
#define ll long long  
//#define max(a,b) (a)>(b)?(a):(b) 
//#define min(a,b) (a)<(b)?(a):(b) 
#define clean(a,b) memset(a,b,sizeof(a))// ˮӡ 
//std::ios::sync_with_stdio(false); 
const int MAXN=2e5+15; 
const ll INF=1e18;  
const ll mod=998244353;  

char a[MAXN],b[MAXN];
int rea[MAXN],reb[MAXN],newb[MAXN];

ll take(ll a,ll b)
{
	ll res=0;
	while(b)
	{
		if(b&1)
			res=(res+a)%mod;
		a=(a+a)%mod;
		b=b>>1;
	}
	return res;
}

ll quick(ll a,ll n)
{
	ll res=1;
	while(n)
	{
		if(n&1)
			res=(res*a)%mod;
		a=(a*a)%mod;
		n=n>>1;
	}
	return res;
}

int main()
{
	int n,m;
	while(~scanf("%d%d",&n,&m))
	{
		clean(a,'\0');
		clean(b,'\0');
		clean(rea,0);
		clean(reb,0);
		clean(newb,0);
		scanf("%s%s",&a,&b);
		//printf("%s\n%s\n",a,b);
		int a_num=0,b_num=0;
		for(int i=0;i<m;++i)//