天天看點

【OJ】總結ACM程式設計易錯點 1285開始用STL程式設計

1286 約瑟夫環

1098 歸并排序

1261 C語言8.27

1023 坑爹的黑店(水題)

1059 1065 圖磚

1068 計算并集

#include<iostream>

#include<algorithm>

using namespace std;

int shu[100010]={0};

int main(){

int nn,mm,ti=0;

for(int i=0;i<100010;i++)

            shu[i]=i+1;

while(cin>>nn>>mm){

ti++;

int re=0;

while(mm--){

int a,b,c,x,y,t;

cin>>a;if(a!=4)cin>>b>>c;

for(int l=0;l<nn;l++){

if(shu[l]==b)x=l;

if(shu[l]==c)y=l;

}

if(a==1){

t=shu[x];

if(x<y){

for(int m=x;m<y-1;m++)

shu[m]=shu[m+1];

shu[y-1]=t;

else{

for(int n=x;n>y;n--)

shu[n]=shu[n-1];

shu[y]=t;

else if(a==2){

for(int m=x;m<y;m++)

for(int n=x;n>y+1;n--)

shu[y+1]=t;

else if(a==3){

t=shu[x];shu[x]=shu[y];shu[y]=t;

else if(a==4){

reverse(shu,shu+nn);

re++;

long long sum=0;

// for(int k=0;k<nn;k++)

// sum+=shu[k++];

        if(nn%2==1){

         long long ss=nn/2+1;

         sum=ss*ss;

        }

        else if(re%2==0){

         long long tt=nn/2;

         sum=tt*tt;

        else if(re%2==1){

         long long rr=nn/2;

         sum=rr*(rr+1);

cout<<"Case "<<ti<<": "<<sum<<endl;

return 0;

假定相同值的元素可能有多個

lower_bound 傳回第一個符合條件的元素位置

upper_bound 傳回最後一個符合條件的元素位置

equal_range 傳回所有等于指定值的頭/尾元素的位置,其實就是lower_bound和upper_bound

binary_search 傳回是否有需要查找的元素。

#include<cstdio>

#include<list>

list<int>shu;

list<int>::iterator it1,it2;

int n,m,ti=0;

while(scanf("%d %d",&n,&m)!=EOF){

while(m--){

int a,b,c;

for(int i=1;i<=n;i++)

shu.push_back(i);

it1=lower_bound(shu.begin(),shu.end(),b);

it2=lower_bound(shu.begin(),shu.end(),c);

shu.insert(it2,b);

shu.erase(it1);

shu.insert(++it1,c);

shu.erase(it2);

swap(it1,it2);

// reverse(shu.begin(),shu.end());

// shu.reverse();

        if(n%2==1){

         long long ss=n/2+1;

         long long tt=n/2;

         long long rr=n/2;

        printf("Case %d: %lld\n",ti,sum);

// cout<<"Case "<<ti<<": "<<sum<<endl;

備文

#define LL long long

#define ULL unsigned long long 

#define mod 1000000007

#define eps 1e-8

#define MP make_pair

typedef long long LL;

typedef pair<int,int>pii;

const int N=100005;

八大A+B格式

邊界數問題,容錯性

少要遞歸,用存數組。

Cin cout scanf()printf() puts(s) gets(s) c=getchar() putchar(c)

While((c=getchar())!=’\n’),for(int i=0;s[i]!=’\0’;i++)注意’\n’和’\0’;or i<strlen(s);

Strcoy strcat,盡量引有的函數

For()for()數比數

空格在之前還是在之後/

大數組定義在main外,要定義大一些,調用function不要定義傳回的數組

引用是c++的

Scanf的Double %lf,定義盡量不要float,精度問題

Double除,記得加點

打表

#define f(x) (x*x+2*x)

秦九韶算法

If else if

__int64 %64I 

Long long %.0f

c -std=c99 随地定義

注意初始化{}内外,int a[100]={0};

I*i<=n i<=sqrt(n) 

及時break for(i=2;i<=sqrt(a);i++)    if(a%i==0){f=0;break;}

While(*a++=*b++)與while(a[i++]=b[i]),++在[]還是在外

While()for()

邊輸邊算

Return n==1?1:n*f(n-1)

if(!a)if(a==0)哪好

Struct 

3!+6!+91+12!+15!+18!+21!

-‘a’+’A’==97-65=32

‘ ‘== 32 ‘0’==48 Tab==9 ,13‘\n’,‘\0’

隻求結果,time,過程

Q: 為什麼我的程式在自己的電腦上正常編譯,而系統告訴我編譯錯誤!

A: 

C:

gcc Main.c -o Main -02 -Wall -lm --static -std=c99 -DONLINE_JUDGE

C++:

g++ Main.cc -o Main -02 -Wall -lm --static -DONLINE_JUDGE

Pascal:

fpc Main.pas -oMain -01 -Co -Cr -Ct -Ci

Java:

javac -J-Xms32m -J-Xmx256m Main.java 

* Java has 2 more seconds and 512M more memory when running and judging.

GCC的編譯标準與VC6有些不同,更加符合c/c++标準:

o (1) main 函數必須傳回int, void main 的函數聲明會報編譯錯誤。

o (2) i 在循環外失去定義 "for(int i=0...){...}"

o (3) itoa 不是ansi标準函數。

o (4) __int64 不是ANSI标準定義,隻能在VC使用,但是可以使用long long聲明64位整數。

Q: 系統傳回資訊都是什麼意思?

詳見下述:

等待 : 系統忙,你的答案在排隊等待。

等待重判 : 因為資料更新或其他原因,系統将重新判你的答案。

編譯中 : 正在編譯。

運作并評判  : 正在運作和判斷。

正确 : 程式通過!

格式錯誤 : 答案基本正确,但是格式不對。

答案錯誤 : 答案不對,僅僅通過樣例資料的測試并不一定是正确答案,一定還有你沒想到的地方。

時間超限 : 運作超出時間限制,檢查下是否有死循環,或者應該有更快的計算方法。

記憶體超限 : 超出記憶體限制,資料可能需要壓縮,檢查記憶體是否有洩露。

輸出超限 : 輸出超過限制,你的輸出比正确答案長了兩倍。

運作錯誤 : 運作時錯誤,非法的記憶體通路,數組越界,指針漂移,調用禁用的系統函數。

編譯錯誤 : 編譯錯誤,請點選後獲得編譯器的詳細輸出。

C++中的long long和__int64類型  

C++中的long long和__int64類型 (轉載)

C語言中long long的用法

http://www.awuit.com/c-language-the-usage-of-long-long/

在分析BT代碼的過程中,遇到了這樣的定義:long long line_position;很是納悶,在C語言中我還沒有見過這樣的寫法,網上搜了,資料也很少,最後在C語言标準與實作這本書中找到了關于long long的說法。在C語言的C99标準擴充了新的整數類型 long long,long是32位寬,占4個位元組,long long通常被定義成 64 位寬,也就可以實作了在32位機器上可以擴充8位元組的資料,GUN C也支援,當然在64位平台上就存在這個問題了。C99标準并沒有硬性規定具體到某種平台上的某種整數類型究竟占用多少位元組、能夠表示多大範圍的數值等,隻是給出一條原則和一個參考數值集合,隻要同時滿足這兩方面條件就算是符合 C 标準。

之後,我檢視了C99标準:

—The rank of long long int shall be greater than the rank of long int,which

shall be greater than the rank of int,which shall be greater than the rank of short

int,which shall be greater than the rank of signed char.

意思是說:

long long 的級别高于 long ,long 的級别高于 int ,int 的級别高于 short ,short 的級别高于 char 。(另外有 _Bool 永遠是最低級别)。級别高的整數類型的寬度大于等于級别較低的整數類型。 

編譯long long需要支援C99标準的編譯器才行,VC并不支援,但有對應的類型__int64

C++ __int64用法

http://341871.blog.51cto.com/331871/71253

  在做ACM題時,經常都會遇到一些比較大的整數。而常用的内置整數類型常常顯得太小了:其中long 和 int 範圍是[-2^31,2^31),即-2147483648~2147483647。而unsigned範圍是[0,2^32),即0~4294967295。也就是說,正常的32位整數隻能夠處理40億以下的數。

  那遇到比40億要大的數怎麼辦呢?這時就要用到C++的64位擴充了。不同的編譯器對64位整數的擴充有所不同。基于ACM的需要,下面僅介紹VC6.0與g++編譯器的擴充。

  VC的64位整數分别叫做__int64與unsigned __int64,其範圍分别是[-2^63, 2^63)與[0,2^64),即-9223372036854775808~9223372036854775807與0~18446744073709551615(約1800億億)。對64位整數的運算與32位整數基本相同,都支援四則運算與位運算等。當進行64位與32位的混合運算時,32位整數會被隐式轉換成64位整數。但是,VC的輸入輸出與__int64的相容就不是很好了,如果你寫下這樣一段代碼:

那麼,在第2行會收到“error C2679: binary '>>' : no operator defined which takes a right-hand operand of type '__int64' (or there is no acceptable conversion)”的錯誤;在第3行會收到“error C2593: 'operator <<' is ambiguous”的錯誤。那是不是就不能進行輸入輸出呢?當然不是,你可以使用C的寫法:

scanf("%I64d",&a);

printf("%I64d",a);

就可以正确輸入輸出了。當使用unsigned __int64時,把"I64d"改為"I64u"就可以了。

  OJ通常使用g++編譯器。其64位擴充方式與VC有所不同,它們分别叫做long long 與 unsigned long long。處理規模與除輸入輸出外的使用方法同上。對于輸入輸出,它的擴充比VC好。既可以使用

cin>>a;

3 cout<<a;

也可以使用

scanf("%lld",&a);

printf("%lld",a);

  最後我補充一點:作為一個特例,如果你使用的是Dev-C++的g++編譯器,它使用的是"%I64d"而非"%lld"。

把Linux的東西移植到Windows 下, 問題真是多, 有時候感覺很是奇怪! 今天有遇到了一個!

__int64在 Windows下怎麼輸出的問題? 我還以為是強制轉換的時候出問題了, 查了好長時間!

下面是測試代碼, 已經通過Windws, Linux兩個平台的測試了!

#include <stdio.h>

#ifdef _WIN32

typedef unsigned __int64 uint64_t;

#else

typedef unsigned long long uint64_t;

#endif

typedef unsigned int uint32_t;

typedef unsigned short uint16_t;

typedef unsigned char uint8_t;

int main(int argc, char *argv[])

{

uint32_t t321, t322, t323;

uint64_t t641, t642, t643;

uint8_t *p;

uint8_t t[64] =

        0x4E, 0x7C, 0x00, 0x00, 0x00, 0x00,

        0x4E, 0x7C, 0x00, 0x00, 0x00, 0x00, 

        0x04, 0x00, 0x00, 0x00, 0x00, 0x00

};

printf(

"sizeof(uint64_t) = %d\n"

"sizeof(uint32_t) = %d\n"

, sizeof(uint64_t), sizeof(uint32_t));

  p = t;

  t321 = *(uint32_t *)p; p += 6;

  t322 = *(uint32_t *)p; p += 6;

  t323 = *(uint32_t *)p; p += 6;

printf("t321[%X].%d t322[%X].%d t323[%X].%d\n"

, t321, t321, t322, t322, t323, t323);

  t641 = *(uint32_t *)p; p += 6;

  t642 = *(uint32_t *)p; p += 6;

  t643 = *(uint32_t *)p; p += 6;

printf("t641[%I64X].%I64d t642[%I64X].%I64d t643[%I64X].%I64d\n"

, t641, t641, t642, t642, t643, t643);

printf("t641[%llX].%lld t642[%llX].%lld t643[%llX].%lld\n"

  t641 = 0x1122334455667788;

printf("%I64X %I64d \n", t641, t641);

printf("%llX %lld \n", t641, t641);

/*

Test Env:

    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86

    Microsoft Windows 2000 [Version 5.00.2195]

Result:

    sizeof(uint64_t) = 8

    sizeof(uint32_t) = 4

    t321[7C4E].31822 t322[7C4E].31822 t323[4].4

    t641[7C4E].31822 t642[7C4E].31822 t643[4].4

    1122334455667788 1234605616436508552

--------------------------------------

    gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-47.3)

 */

在進行移植的時候可能用的上的:

#  define APR_UINT64_T_HEX_FMT     "llx"

#  define APR_UINT64_T_HEX_FMT     "I64x"

example:

     sprintf(buf, "%" APR_UINT64_T_HEX_FMT, var);

#define HOST_WIDEST_INT_PRINT_DEC       "%I64d" 

#define HOST_WIDEST_INT_PRINT_UNSIGNED  "%I64u" 

#define HOST_WIDEST_INT_PRINT_HEX       "0x%I64x"

 發表于: 2007-10-18,修改于: 2007-10-18 16:21 

#include <stdlib.h>

int a[500001],t[500001];

long long sum;

void Merge(int l,int m,int r){

        int p=0, i=l,j=m+1;

        while(i<=m&&j<=r)   {

                if(a[i]>a[j]) { t[p++]=a[j++]; sum+=m-i+1;  }

                else   t[p++]=a[i++];      }

        while(i<=m)   t[p++]=a[i++];

        while(j<=r)   t[p++]=a[j++];

        for(i=0;i<p;i++)  a[l+i]=t[i];

void MergeSort(int l,int r){

        int m;

        if(l<r)  {

                m=(l+r)/2;

                MergeSort(l,m);

                MergeSort(m+1,r);

                Merge(l,m,r);     }

        int n,i;

        while(scanf("%d",&n)!=EOF,n)   {

                sum=0;

                for(i=0;i<n;i++)   scanf("%d",&a[i]);

                MergeSort(0,n-1);

                printf("%lld\n",sum);

        return 0;

#include <iostream>

#include<cstring>

char s[22],str[22][22];

int main() {

int a;

for(int i=0;i<=a;i++)////

   //cin.getline(str[i],'\n');

       gets(str[i]);

for(int i=0;i<=a-1;i++)///

for(int j=0;j<=a-1-i;j++)////

if(strcmp(str[j],str[j+1])>0)

strcpy(s,str[j]);

strcpy(str[j],str[j+1]);

strcpy(str[j+1],s);

for(int i=1;i<=a;i++)////

cout<<str[i]<<endl;