2021.1.23--vj补题

B - B

 CodeForces - 879B 

n people are standing in a line to play table tennis. At first, the first two players in the line play a game. Then the loser goes to the end of the line, and the winner plays with the next person from the line, and so on. They play until someone wins k games in a row. This player becomes the winner.

For each of the participants, you know the power to play table tennis, and for all players these values are different. In a game the player with greater power always wins. Determine who will be the winner.

Input

The first line contains two integers: n and k (2 ≤ n ≤ 500, 2 ≤ k ≤ 1012) — the number of people and the number of wins.

The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ n) — powers of the player. It's guaranteed that this line contains a valid permutation, i.e. all ai are distinct.

Output

Output a single integer — power of the winner.

Examples

Input
2 2
1 2
Output
2 
Input
4 2
3 1 2 4
Output
3 
Input
6 2
6 5 3 1 2 4
Output
6 
Input
2 10000000000
2 1
Output
2

Note

Games in the second sample:

3 plays with 1. 3 wins. 1 goes to the end of the line.

3 plays with 2. 3 wins. He wins twice in a row. He becomes the winner.

题意:有n个人排成一排比赛,给出了每个人的武力值,开始时前两个人打,输的人去队伍后面,赢的人接着和下一个人打,以此类推,直至有人连赢k场,比赛结束,输出该人的能力值。

需要用long long 

思路:从头遍历一遍,如果有人赢得了k场则输出,如果没有那一定是武力值最大的人,直接输出即可。

一开始就按照题目中的来遍历,把输的值排到后面,扩大数组长度,直到某个人武力值达到要求结束遍历,但在测试点18wa掉了,然后就按照上面这个思路来做,也没有直接对,用错了步骤方法,又改了几遍才对。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n;
    long long k;
    cin>>n>>k;
    long long s[2*n]={0},b[2*n]={0},minn=-1;
    for(long long i=0;i<n;i++)
    {
        cin>>s[i];
        minn=max(minn,s[i]);
    }
    long long ct=0,i,j;
    for( j=0;j<n;j++)
    {
        if(j!=0&&s[j]>s[j-1])
        {
            ct=1;
        }
        else{
            ct=0;
        }
        for(i=j+1;i<n;i++)
        {
            if(s[j]>s[i])ct++;
            else break;
        }
        if(ct>=k)
        {
            cout<<s[j]<<endl;
            break;
        }
    }
    if(j>=n)
    {
        cout<<minn<<endl;
    }
}

 

C - C

 CodeForces - 879C 

Petya learned a new programming language CALPAS. A program in this language always takes one non-negative integer and returns one non-negative integer as well.

In the language, there are only three commands: apply a bitwise operation AND, OR or XOR with a given constant to the current integer. A program can contain an arbitrary sequence of these operations with arbitrary constants from 0 to 1023. When the program is run, all operations are applied (in the given order) to the argument and in the end the result integer is returned.

Petya wrote a program in this language, but it turned out to be too long. Write a program in CALPAS that does the same thing as the Petya's program, and consists of no more than 5 lines. Your program should return the same integer as Petya's program for all arguments from 0 to 1023.

Input

The first line contains an integer n (1 ≤ n ≤ 5·105) — the number of lines.

Next n lines contain commands. A command consists of a character that represents the operation ("&", "|" or "^" for AND, OR or XOR respectively), and the constant xi 0 ≤ xi ≤ 1023.

Output

Output an integer k (0 ≤ k ≤ 5) — the length of your program.

Next k lines must contain commands in the same format as in the input.

Examples

Input
3
| 3
^ 2
| 1
Output
2
| 3
^ 2
Input
3
& 1
& 3
& 5
Output
1
& 1
Input
3
^ 1
^ 2
^ 3
Output
0

Note

You can read about bitwise operations in https://en.wikipedia.org/wiki/Bitwise_operation.

Second sample:

Let x be an input of the Petya's program. It's output is ((x&1)&3)&5 = x&(1&3&5) = x&1. So these two programs always give the same outputs.

题意:给出一个n,然后紧接着跟着n行的程序,每一行含有一个操作符和一个操作数,操作符只有三种与,或,异或。同时规定所有的操作数都在0-1023之间。要求把给出的程序缩短,缩短到5行之内。

自己做的时候理解错了题意,以为是把相同的运算符简化再直接输出,但看了别人的也没有很理解。。。。

我的错误代码:

#include<bits/stdc++.h>
#define N 500005
using namespace std;
int main()
{
    map<char,int>mp;
    int n;
    cin>>n;
    char ch;
    int k[N];
    for(int i=0;i<n;i++)
    {
        cin>>ch>>k[i];
        if(mp[ch]==0)mp[ch]=k[i];
        else
        {
            if(ch=='|')
            {
                mp[ch]|=k[i];
            }
            else if(ch=='^')mp[ch]^=k[i];
            else if(ch=='&')mp[ch]&=k[i];
        }
    }
    int m=mp.size();
    if(mp['|']==0&&mp['&']==0&&mp['^']==0) cout<<"0"<<endl;
    else{
    cout<<m<<endl;
   // cout<<"^ "<<mp['^']<<"*"<<endl;
    if(mp['|']!=0)cout<<"| "<<mp['|']<<endl;
    if(mp['^']!=0)cout<<"^ "<<mp['^']<<endl;
    if(mp['&']!=0)cout<<"& "<<mp['&']<<endl;
    }
}
View Code

(别人的)正确思路:位运算的等价变换

链接:(具体)

https://www.cnblogs.com/siuginhung/p/7743536.html

正确代码:#include<bits/stdc++.using namespace std;

int main()
{
    int a,b;
    a = 0,b = 1023;
    int n;
    scanf("%d",&n);
    char s[100];
    int num;
    while(n--)
    {
        scanf("%s%d",s,&num);
        if(s[0] == '|')
        {
            a |= num;
            b |= num;
        }
        else if(s[0] == '&')
        {
            a &= num;
            b &= num;
        }
        else if(s[0] == '^')
        {
            a ^= num;
            b ^= num;
        }
    }
    int x=0,y=0,z=0;
    x=a | b;
    y=a & b;
    z=a & (b ^ 1023);
    printf("3\n");
    printf("| %d\n",y);
    printf("& %d\n",x);
    printf("^ %d\n",z);
}

 

posted @ 2021-01-26 19:55  西瓜0  阅读(70)  评论(0)    收藏  举报