Atcoder Regular 098

A

用scanf("%s")就会WA..不知道为什么

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[8][2] = {{0, 1}, {1, 0}, {0, -1}, { -1, 0}, {1, 1}, {1, -1}, { -1, -1}, { -1, 1}};
const int mod = 1e9 + 7;
const int gakki = 5 + 2 + 1 + 19880611 + 1e9;
const int N = 3e5 + 5;
int preE[N];
int preW[N];
string f;
int main()
{
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        int n;
        cin >> n;
        cin >> f;
        preE[0] = preW[0] = 0;
        for (int i = 1; i <= n; i++)
        {
                if (f[i - 1] == 'W')
                {
                        preW[i] = preW[i - 1] + 1;
                        preE[i] = preE[i - 1];
                }
                else
                {
                        preE[i] = preE[i - 1] + 1;
                        preW[i] = preW[i - 1];
                }
        }
        ll anser = INT_MAX;
        ll now;
        for (int i = 1; i <= n; i++)
        {
                now = preW[i - 1] - preW[0];
                now += preE[n] - preE[i];
                anser = min(anser, now);
        }
        cout << anser << endl;
        return 0;
}
View Code

B

题意:给你N个非负数(1e5) 要求你求出有多少个区间内 区间和等于区间亦或和 给的数小于220

解:

①:

因为XOR操作中 0^0=0 1^1=0 0^1=1 如果两个数相加有进位操作的话 肯定会损失值

所以我们把0特殊化 直接暴力 如果有位数重复的就不成立 所以每次查询的区间长度不会超过20

复杂度为1e6左右

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[8][2] = {{0, 1}, {1, 0}, {0, -1}, { -1, 0}, {1, 1}, {1, -1}, { -1, -1}, { -1, 1}};
const int mod = 1e9 + 7;
const int gakki = 5 + 2 + 1 + 19880611 + 1e9;
const int N = 2e5 + 5;
ll num[N];
int last = 0;
int Left[N];
ll yihuo;
ll pre;
int main()
{
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        int n;
        cin >> n;
        ll anser = 0;
        for (int i = 1; i <= n; i++)
        {
                cin >> num[i];
                Left[i] = last;
                if (num[i])
                {
                        last = i;
                }
        }
        ll now;
        ll i, j;
        for (i = 1; i <= n; i++)
        {
                yihuo = pre = num[i];
                for (j = Left[i]; j >= 1;j = Left[j])
                {
                        yihuo = yihuo ^ num[j];
                        pre += num[j];
                        if (yihuo != pre)
                        {
                                break;
                        }
                }
                anser+=i-j;
        }
        cout << anser << endl;
        return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/Aragaki/p/9112288.html