PA 2011 Round 3 prz题解

题目大意,现在要走过一条斑马线,斑马线是由n条交替的黑条和白条构成的,第一条是黑条。脚的长度是s。要求在走的过程中,他脚的任何一部分都不能碰到象征邪恶的黑条。第一条之前和第n条之后的部分都是白色的,可以任意选择第一条之前的位置出发。但出发位置一旦选定,之后每一步的长度都必须是k。请你判断有没有可能在不碰到黑条的情况下通过斑马线,即走到第n条之后。

此题同样是模拟赛题!!!

我现在已经非常质疑自己的智商了,为什么每次都是离正解只差一步呢,每次都不能换一个思路去想一想。

先说说我的错误解法:我列了n个不等式,判断它能不能踩到黑块,i*k-x>=a[i],i*k-x+s<=a[i+1]-kuan[i+1],i为黑块,但是走几步是一个问题,还有这一个白块可不可以走到也是一个问题,所以正确的处理方法应该是。。。。。。。

正解:因为白块不一定要走到,所以我们枚举只要判断能不能不走到黑块就行了,我们首先将每一个黑块的起始位置和结束位置mod k,并将它对应到(0,k-1)的一块区间内,如果x>y,则对应到(x,k-1),(0,y)中,判断有没有属于(0,k-1)中的点没有被覆盖到的情况。

但还要注意一个问题,如果一个黑块长度大于k-s+1,那么是怎么也不行的,因为它怎么也跨不过去。

这道题很多人说用开区间好处理,其实闭区间也很好处理。

本题总结:现在经常忘了一样东西就是mod,每次都是利用i来控制范围,却忘记了i这个变量的不确定性,对于不确定问题,mod是一个很好的武器,因为它和i没有关系,利用mod可以大大减小程序复杂度和思维复杂度。以后不能忘了

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 using namespace std;
  5 long long p[500005];
  6 struct node
  7 {
  8     int from,to;
  9 }a[500005];
 10 int n;
 11 int s,k;
 12 int T;
 13 int m;
 14 long long len;
 15 void read(int &x){
 16     char ch = getchar(); while (ch < ‘0‘ || ch > ‘9‘) ch = getchar();
 17     for (x = 0; ch >= ‘0‘ && ch <= ‘9‘; ch = getchar()) x = x*10+ch-48;
 18 }
 19 bool cmp(node u,node v)
 20 {
 21     if(u.from!=v.from)return u.from<v.from;
 22     return u.to>v.to;
 23 }
 24 bool rt;
 25 int l,r;
 26 int main()
 27 {
 28     read(T);
 29     while(T--)
 30     {
 31         len=0;
 32         rt=false;
 33         read(s);
 34         s--;
 35         read(k);
 36         read(n);
 37         for(int i=1;i<=n;i++)
 38         {
 39             int x;
 40             read(x);
 41             len+=x;
 42             p[i]=len;
 43         }
 44         m=0;
 45         for(int i=1;i<=n;i+=2)
 46         {
 47             if(p[i]-p[i-1]>=k-s)
 48             {
 49             //    cout<<p[i]-p[i-1]<<endl;
 50                 puts("NIE");
 51                 rt=true;
 52                 break;
 53             }
 54             long long x=p[i-1]-s,y=p[i]-1;
 55             x=(x%k+k)%k;
 56             y=y%k;
 57         //    cout<<x<<" "<<y<<endl;
 58             if(x<=y){
 59                 a[++m].from=x;
 60                 a[m].to=y;
 61             }
 62             else
 63             {
 64                 a[++m].from=x;
 65                 a[m].to=k-1;
 66                 a[++m].from=0;
 67                 a[m].to=y;
 68             }
 69         }
 70         if(rt)continue;
 71     //    cout<<"find";
 72         sort(a+1,a+m+1,cmp);
 73         if(a[1].from>0)
 74         {
 75             puts("TAK");
 76             continue;
 77         }
 78         l=a[1].from;r=a[1].to;
 79         /*for(int i=1;i<=m;i++)
 80         printf("%d %d\n",a[i].from,a[i].to);*/
 81         for(int i=2;i<=m;i++)
 82         {
 83         //    cout<<a[i].from<<" "<<r<<endl;
 84             if(a[i].from>r+1)
 85             {
 86                 //cout<<i<<r<<endl;
 87                 rt=true;
 88                 puts("TAK");
 89                 break;
 90             }
 91             if(a[i].from<=r+1 && a[i].to>=r)
 92             {
 93                 r=a[i].to;
 94             }
 95         }
 96         if(rt)continue;
 97         if(r<k-1)
 98         {
 99             puts("TAK");
100         }
101         else
102         {
103             puts("NIE");
104         }
105     }
106     return 0;
107 }
108
109             

PA 2011 Round 3 prz题解

时间: 2024-08-05 10:23:20

PA 2011 Round 3 prz题解的相关文章

NOIP 2011 Day 1 部分题解 (Prob#1 and Prob#2)

Problem 1: 铺地毯 乍一看吓cry,地毯覆盖...好像是2-dims 线段树,刚开头就这么难,再一看,只要求求出一个点,果断水题,模拟即可.(注意从标号大的往小的枚举,只要有一块地毯符合要求就输出,返回.) (全篇未完结,代码就不发了.) Problem 2: 选择客栈 模拟果断会超时,所以用类似动态规划的方法. 用$\text{sum}\left[ i\right]$表示从一号客栈到i号客栈途中的符合要求的Café总数,自然,$\text{O}\left( n\right)$的时间复

POJ 3252 Round Numbers 数学题解

Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors', 'Ro, Sham, Bo', and a host of other names) in order to make arbitrary decisions such as who gets

CodeForces 86D(Yandex.Algorithm 2011 Round 2)

思路:莫队算法,离线操作,将所有询问的左端点进行分块(分成sqrt(n) 块每块sqrt(n)个),用左端点的块号进行排序小的在前,块号相等的,右端点小的在前面. 这样要是两个相邻的查询在同一块内左端点每次最多移动sqrt(n) n次的话效率为nsqrt(n) ,对于同一块内右端点为有序的那么最多移动 n次  .总的效率为nsqrt(n) . 要是相邻的查询不同块 最坏效率为O(n) 因为块最多为sqrt(n)个那么坏效率也为nsqrt(n).   总的效率就为nsqrt(n) #include

Educational Codeforces Round 64部分题解

Educational Codeforces Round 64部分题解 A 题目大意:给定三角形(高等于低的等腰),正方形,圆,在满足其高,边长,半径最大(保证在上一个图形的内部)的前提下. 判断交点个数是否有限,如果有限,输出. 很明显当正方形套三角形或者三角形套正方形是交点个数是无限的(因为有一条边相交) 其他图形的嵌套交点个数比较好判断,不多赘述 但是注意坑点: 当按照矩形,园,三角这样的顺序是,三角与圆的一个交点是与圆和正方形的交点重合的,判一下就好了 #include<cstdio>

Codeforces Global Round 1 (A-E题解)

Codeforces Global Round 1 题目链接:https://codeforces.com/contest/1110 A. Parity 题意: 给出{ak},b,k,判断a1*b^(k-1)+a2*b^(k-2)+...+ak*b^0的奇偶性. 题解: 暴力求模2意义下的值就好了. 代码如下: #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5+5; int

Codeforces Round #616 部分题解

老年选手诈尸? A,B 咕了. C - Prefix Enlightenment 很容易看出这个限制条件可以推出每个点最多被两个集合包含.按照套路,很容易联想到给这两个集合连一条边,表示他们的状态要相同/不同. 因为保证了有解,所以从左往右扫的时候拿并查集维护一下每个连通块的二分图情况,选较小的那一边. 如果只被一个集合覆盖,那么就相当于强制这个集合选/不选,在做并查集的时候特判一下即可. 代码咕了. D - Coffee Varieties (hard version) 作为一名憨憨,做法当然

Codeforces #Round 376 部分题解

A: 题目传送门:http://codeforces.com/problemset/problem/731/A 直接根据题意模拟即可 1 #include "bits/stdc++.h" 2 3 using namespace std ; 4 typedef long long QAQ ; 5 6 char s[ 1010 ] ; 7 8 inline int Calc ( const char x , const char y ) { 9 if ( x > y ) return

BestCoder Round #20 部分题解(A,B,C)(hdu5123,5124,5124)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud who is the best? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description There are N people want to choose the best person. Each person select

GCJ Round 1C 2016 题解

ASenate Evacuation B Slides C Fashion Police A.Senate Evacuation #include<bits/stdc++.h> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define For