
10 10 5 5 10 10 6 6
YES NO
/**
 * Created by ckboss on 14-10-3.
 */
import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext())
        {
            int N=in.nextInt();
            int M=in.nextInt();
            int x=in.nextInt();
            int y=in.nextInt();
            if(x==N-x&&y==M-y)
                System.out.println("YES");
            else
                System.out.println("NO");
        }
    }
}3 0 1 3 3 5 4 2 3 2 4 6
301 425 -1
/**
 * Created by ckboss on 14-10-3.
 */
import java.util.*;
public class Main {
    static int[] num = new int[10];
    static char[] ans = new char[110];
    static int nt;
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n;
        while(in.hasNext()){
            n=in.nextInt();
            int flag=0;
            int MinJ=111;
            Arrays.fill(num,0); nt=0;
            for(int i=0;i<n;i++){
                int x=in.nextInt();
                num[x]++;
                if(x%2==1){
                    if(x<MinJ) MinJ=x;
                    flag++;
                }
            }
            if(flag==0)
            {
                System.out.println("-1");
                continue;
            }
            num[MinJ]--;
            for(int i=9;i>=0;i--){
                for(int j=num[i];j>0;j--){
                    ans[nt++]=(char)('0'+i);
                }
            }
            ans[nt++]=(char)(MinJ+'0');
            flag=0;
            for(int i=0;i<nt;i++){
                if(ans[i]=='0' && flag==0){
                    flag=0; break;
                }
                flag=1;
                System.out.print(ans[i]);
            }
            if(flag==1)
                System.out.println("");
            else
                System.out.println("-1");
        }
    }
}3 abc 1 abcabc 1 abcabc 2
6 15 21
/**
 * Created by ckboss on 14-10-3.
 */
import java.util.*;
public class Main {
    static long[] num = new long[30];
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int T_T=in.nextInt();
        while(T_T-->0){
            String st=in.next();
            int k=in.nextInt();
            Arrays.fill(num,0);
            int be=0,ed=0;
            long ans=0;
            for(int i=0,sz=st.length();i<sz;i++){
                int id=(int)(st.charAt(i)-'a');
                num[id]++;
                if(num[id]>k){
                    for(;be<=ed;be++){
                        ans+=ed-be+1;
                        num[st.charAt(be)-'a']--;
                        if(st.charAt(be)-'a'==id) {
                            be++;
                            break;
                        }
                    }
                }
                ed=i;
            }
            for(;be<=ed;be++){
                ans+=ed-be+1;
                num[st.charAt(be)-'a']--;
            }
            System.out.println(ans);
        }
    }
}1 5 7 10 11 12 13 14 Q 1 5 2 1 Q 1 5 1 0 Q 1 5 1 1 Q 1 5 3 0 Q 1 5 3 1 S 1 100 Q 1 5 3 1
5 1 1 5 0 1
分块大法好....
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=100100;
struct BLOCK
{
    int cnt[10][10];
}block[400];
int block_size,block_num;
int n,m;
int a[maxn];
const int ten[12]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
void CHANGE(int p,int v)
{
    int id=p/block_size;
    int x=a[p];
    for(int i=0;i<10;i++)
    {
        block[id].cnt[i][x%10]--;
        x/=10;
    }
    a[p]=v;
    x=v;
    for(int i=0;i<10;i++)
    {
        block[id].cnt[i][x%10]++;
        x/=10;
    }
}
int QUERY(int l,int r,int p,int d)
{
    int L=l/block_size,R=r/block_size;
    int ans=0;
    if(R-L<=1)
    {
        for(int i=l;i<=r;i++)
        {
            ans+=((a[i]/ten[p-1])%10==d)?1:0;
        }
        return ans;
    }
    for(int i=l;i<(L+1)*block_size;i++)
    {
        ans+=((a[i]/ten[p-1])%10==d)?1:0;
    }
    for(int i=L+1;i<=R-1;i++)
    {
        ans+=block[i].cnt[p-1][d];
    }
    for(int i=R*block_size;i<=r;i++)
    {
        ans+=((a[i]/ten[p-1])%10==d)?1:0;
    }
    return ans;
}
int main()
{
    int T_T;
    scanf("%d",&T_T);
    while(T_T--)
    {
        scanf("%d%d",&n,&m);
        memset(block,0,sizeof(block));
        block_size=sqrt(n*1.0)+1;
        block_num=n/block_size+1;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            int x=a[i];
            int id=i/block_size;
            for(int j=0;j<10;j++)
            {
                block[id].cnt[j][x%10]++;
                x/=10;
            }
        }
        while(m--)
        {
            char op[10];
            int a,b,c,d;
            scanf("%s",op);
            if(op[0]=='Q')
            {
                scanf("%d%d%d%d",&a,&b,&c,&d);
                printf("%d\n",QUERY(a,b,c,d));
            }
            else if(op[0]=='S')
            {
                scanf("%d%d",&a,&b);
                CHANGE(a,b);
            }
        }
    }
    return 0;
}
BestCoder Round #11 (Div. 2) 题解
原文:http://blog.csdn.net/ck_boss/article/details/39759589